/*
	Compresor Gzip
    Copyright (C) 2012 Darío López Padial 
    @bukosabino

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>
*/

/**
 @file LZcoder.h
 @brief Especificación de la clase LZ
 @author Dario Lopez Padial
 */

#ifndef _LZ_coder_H_
#define _LZ_coder_H_

#include "vectordinamico.h"

/**
@class LZ
@brief Algoritmo capaz de buscar coincidencias de una cadena de caracteres. Cumpliendo las especificaciones
del algoritmo Deflate ( longitudes mayores de 3 y distancias no superiores a 32768 caracteres).
*/



class LZ {

	private:

		VD v_dinamico;
		unsigned int indice;
		unsigned int distancia;
		
		/*
		@brief: Buscar coincidencias entre cadenas de caracteres, en el flujo.
		*/
		unsigned int Busca_Coincidencias ();

	public:

		/**
		@brief: Constructor por defecto.
		*/
		LZ () {
			indice=0;
			distancia=0;
		}

		/**
		@brief:	Constructor por parámetros.
				Recibe un vector dinámico y lo carga.
		*/
		LZ (VD & v) {
			Cargar_cadena(v);
			indice = 0;
			distancia = 0;
		}

		/**
		@brief:	Carga un vector dinámico entrante, en el vector dinámico implícito de la clase.
		*/
		void Cargar_cadena (VD & v){
			v_dinamico = v;
		}

		/**
		@brief:	Devuelve el valor del atributo distancia.
		*/
		unsigned int Get_distancia () {
			return distancia;
		}

		/**
		@brief:		Recorre la cadena de caracteres buscando cadenas de caracteres coincidentes.
		@return:	Código de literales (sin coincidencias), distancias o longitudes.
		*/
		unsigned int Avanza ();

		/**
		@brief:	Destructor.
		*/
		~LZ () { };

};
#endif
